/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.dao;

import br.com.classes.Movimento;
import com.mysql.jdbc.Statement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.sql.Date;
import java.util.Iterator;
import java.util.List;

/**
 *
 * @author Usuario
 */
public class MovimentoDao {

    Connection con = null;


    public MovimentoDao() {
        con = Conecta.getConnection();
    }

    public int CadastrarMovimento(Movimento mv) throws Exception {
        
        String sql = ("insert into movimento values(null,?,?,?,?,?,?,?,?,?,?,?,CURDATE(),?)");
        PreparedStatement prep = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
        int key = 0;    
        prep.setString(1, mv.getData());
        if (mv.getData_pre() == null){
            prep.setString(2, null);
        } else {
            prep.setString(2, mv.getData_pre());
        }       
        prep.setString(3, mv.getPagamento());
        
        if (mv.getMov_cheque() == 0) {
            prep.setString(4, null);
        } else {
            prep.setInt(4, mv.getMov_cheque());
        }
        if (mv.getMov_banco() == 0) {
            prep.setString(5, null);
        } else {
            prep.setInt(5, mv.getMov_banco());
        }
        prep.setDouble(6, mv.getCredito());
        prep.setDouble(7, mv.getDebito());
        prep.setString(8, mv.getMov_historico());
        if (mv.getMov_cod_entidade() == 0)
        {
            prep.setString(9, null);
        }else{ 
        prep.setInt(9, mv.getMov_cod_entidade());
        }prep.setInt(10, mv.getMov_caixa());
        prep.setInt(11, mv.getMov_usuario());
        prep.setInt(12, mv.getTipo());
        //Devolve o ID do ultimo movimento cadastrado
        prep.executeUpdate(); 
        ResultSet keys = prep.getGeneratedKeys();
        keys.next();
        key = keys.getInt(1);
        keys.close();
    //    prep.close();
  //      con.close();
          return key;
    }

    public void AlterarMovimento(Movimento mv) {

        try {
            String sql = "update movimento set data=?, data_pre=?, pagamento=?, mov_cheque=?, mov_banco=?, credito=?, debito=?, mov_historico=?, mov_entidade=?, mov_caixa=?, mov_usuario=?, data_mov= CURDATE(), tipo=?  WHERE cod_movimento= ?";
            PreparedStatement prep = con.prepareStatement(sql);
            prep.setString(1, mv.getData());
         if (mv.getData_pre() == null){
            prep.setString(2, null);
        }else {
           prep.setString(2, mv.getData_pre());
        }
            prep.setString(3, mv.getPagamento());
         if (mv.getMov_cheque() == 0) {
                prep.setString(4, null);
         }else {
                prep.setInt(4, mv.getMov_cheque());
         }
         if (mv.getMov_banco() == 0) {
                prep.setString(5, null);
         } else {
                prep.setInt(5, mv.getMov_banco());
         }
            prep.setDouble(6, mv.getCredito());
            prep.setDouble(7, mv.getDebito());
            prep.setString(8, mv.getMov_historico());
            prep.setInt(9, mv.getMov_cod_entidade());
            prep.setInt(10, mv.getMov_caixa());
            prep.setInt(11, mv.getMov_usuario());
       //   prep.setString(10, mv.getData_mov().toString());
            prep.setInt(12, mv.getTipo());
            prep.setInt(13, mv.getCod_movimento());
            prep.execute();

        } catch (SQLException ex) {
            System.out.println(ex.getMessage()+" Funcao MovimentoDao AlterarMovimento");
        }
    }

    public void DeletarMovimento(Movimento m) throws Exception {
        String sql = ("delete from movimento where cod_movimento = ?");
        PreparedStatement prep = con.prepareStatement(sql);
        prep.setInt(1, m.getCod_movimento());
        prep.execute();
    }

    public int UltimoCodMov() {

        int cod = 0;
        try {
            String sql = "select max(cod_movimento) as codigo from movimento";
            PreparedStatement ps = con.prepareStatement(sql);
            ResultSet rs = ps.executeQuery();

            while (rs.next()) {
                cod = rs.getInt("codigo");
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage()+" Funcao MovimentoDao");
        }
        return cod;
    }

    public List<Movimento> ListarMovimento() {
      
        List<Movimento> lista = new ArrayList<Movimento>();
        try {

            String sql = "select * from movimento order by cod_movimento desc";
            PreparedStatement stmt = con.prepareStatement(sql);
            ResultSet rs = stmt.executeQuery();

            while (rs.next()) {

                Movimento m = new Movimento();
                m.setCod_movimento(rs.getInt("cod_movimento"));
                m.setData(rs.getString("data"));
                m.setData_pre(rs.getString("data_pre"));
                m.setPagamento(rs.getString("pagamento"));
                m.setMov_cheque(rs.getInt("mov_cheque"));
                m.setMov_banco(rs.getInt("mov_banco"));
                m.setCredito(rs.getDouble("credito"));
                m.setDebito(rs.getDouble("debito"));
                m.setMov_historico(rs.getString("mov_historico"));
                m.setMov_cod_entidade(rs.getInt("mov_cod_entidade"));
                m.setMov_caixa(rs.getInt("mov_caixa"));
                m.setMov_usuario(rs.getInt("mov_usuario"));
                m.setData_mov(rs.getDate("data_mov"));
                m.setTipo(rs.getInt("tipo"));
                lista.add(m);
            }
        } catch (SQLException ex) {
        }
      
        return lista;
    }

    public Movimento PesquisarMovimento(int cod_mov) {

        Movimento m = null;
        try {
            String sql = "select * from movimento where cod_movimento=?";
            PreparedStatement ps = con.prepareStatement(sql);
            ps.setInt(1, cod_mov);

            ResultSet rs = ps.executeQuery();

            while (rs.next()) {
                m = new Movimento();
                m.setCod_movimento(rs.getInt("cod_movimento"));
                m.setData(rs.getString("data"));
                m.setData_pre(rs.getString("data_pre"));
                m.setPagamento(rs.getString("pagamento"));
                m.setMov_cheque(rs.getInt("mov_cheque"));
                m.setMov_banco(rs.getInt("mov_banco"));
                m.setCredito(rs.getDouble("credito"));
                m.setDebito(rs.getDouble("debito"));
                m.setMov_historico(rs.getString("mov_historico"));
                m.setTipo(rs.getInt("tipo"));
                m.setMov_caixa(rs.getInt("mov_caixa"));
                m.setMov_usuario(rs.getInt("mov_usuario"));
                m.setData_mov(rs.getDate("data_mov"));
                m.setMov_cod_entidade(rs.getInt("mov_entidade"));
            }
        } catch (SQLException d) {
            System.out.println(d.getMessage()+" Funcao MovimentoDao PesquisarMovimento");
        }
        return m;
    }

    public List<Movimento> ProcurarPorMovLetra(String movimento) {

        List<Movimento> lista = new ArrayList<Movimento>();
        try {

            String sql = "select * from movimento where nome_ent like ?";
            PreparedStatement stmt = con.prepareStatement(sql);
            stmt.setString(1, "%" + movimento + "%");
            ResultSet rs = stmt.executeQuery();

            while (rs.next()) {

                Movimento m = new Movimento();
                m.setCod_movimento(rs.getInt("cod_movimento"));
                m.setData(rs.getString("data"));
                m.setData_pre(rs.getString("data_pre"));
                m.setPagamento(rs.getString("pagamento"));
                m.setMov_cheque(rs.getInt("mov_cheque"));
                m.setMov_banco(rs.getInt("mov_banco"));
                m.setCredito(rs.getDouble("credito"));
                m.setDebito(rs.getDouble("debito"));
                m.setMov_historico(rs.getString("mov_historico"));
                m.setTipo(rs.getInt("tipo"));
                m.setMov_caixa(rs.getInt("mov_caixa"));
                m.setMov_usuario(rs.getInt("mov_usuario"));
                m.setData_mov(rs.getDate("data_mov"));
                m.setMov_cod_entidade(rs.getInt("mov_cod_entidade"));
                lista.add(m);
            }
        } catch (SQLException ex) {
        }
        return lista;
    }

    public List<Movimento> ListarMovCaixa() {
        List<Movimento> lista = new ArrayList<Movimento>();
        try {

            String sql = "select * from movimento";
            PreparedStatement stmt = con.prepareStatement(sql);
            ResultSet rs = stmt.executeQuery();

            while (rs.next()) {
                Movimento m = new Movimento();

                m.setCod_movimento(rs.getInt("cod_movimento"));
                m.setData(rs.getString("data"));
                m.setData_pre(rs.getString("data_pre"));
                m.setPagamento(rs.getString("pagamento"));
                m.setMov_cheque(rs.getInt("mov_cheque"));
                m.setMov_banco(rs.getInt("mov_banco"));
                m.setCredito(rs.getDouble("credito"));
                m.setDebito(rs.getDouble("debito"));
                m.setMov_historico(rs.getString("mov_historico"));
                m.setTipo(rs.getInt("tipo"));
                m.setMov_caixa(rs.getInt("mov_caixa"));
                m.setMov_usuario(rs.getInt("mov_usuario"));
                m.setData_mov(rs.getDate("data_mov"));
                m.setMov_cod_entidade(rs.getInt("mov_entidade"));
                lista.add(m);
            }
        } catch (SQLException ex) {
        }
        //System.out.println(lista);
        return lista;
    }

    public List<Movimento> ListarMovCaixa(int movcaixa) {

        List<Movimento> lista = new ArrayList<Movimento>();

        try {

            String sql = "select * from movimento where mov_caixa = ? order by cod_movimento desc";
            PreparedStatement stmt = con.prepareStatement(sql);
            stmt.setInt(1, movcaixa);

            ResultSet rs = stmt.executeQuery();

            while (rs.next()) {

                Movimento m = new Movimento();
                m.setCod_movimento(rs.getInt("cod_movimento"));
                m.setData(rs.getString("data"));
                m.setData_pre(rs.getString("data_pre"));
                m.setPagamento(rs.getString("pagamento"));
                m.setMov_cheque(rs.getInt("mov_cheque"));
                m.setMov_banco(rs.getInt("mov_banco"));
                m.setCredito(rs.getDouble("credito"));
                m.setDebito(rs.getDouble("debito"));
                m.setMov_historico(rs.getString("mov_historico"));
                m.setMov_cod_entidade(rs.getInt("mov_entidade"));
                m.setMov_caixa(rs.getInt("mov_caixa"));
                m.setMov_usuario(rs.getInt("mov_usuario"));
                m.setData_mov(rs.getDate("data_mov"));
                m.setTipo(rs.getInt("tipo"));
                lista.add(m);

            }
        } catch (SQLException ex) {
        }
        return lista;
    }

    public List<Movimento> BuscarLimiteMov(int num, int cod_caixa) {
       
        List<Movimento> lista = new ArrayList<Movimento>();
        try {
            
            String sql = "select * from movimento where mov_caixa=? order by cod_movimento desc limit ?, 50";
            
            PreparedStatement stmt = con.prepareStatement(sql);
            stmt.setInt(1, cod_caixa);
            stmt.setInt(2, num);
            
            ResultSet rs = stmt.executeQuery();

            while (rs.next()) {
                Movimento m = new Movimento();
                m.setCod_movimento(rs.getInt("cod_movimento"));
                m.setData(rs.getString("data"));
                m.setData_pre(rs.getString("data_pre"));
                m.setPagamento(rs.getString("pagamento"));
                m.setMov_cheque(rs.getInt("mov_cheque"));
                m.setMov_banco(rs.getInt("mov_banco"));
                m.setCredito(rs.getDouble("credito"));
                m.setDebito(rs.getDouble("debito"));
                m.setMov_historico(rs.getString("mov_historico"));
                m.setMov_cod_entidade(rs.getInt("mov_entidade"));
                m.setMov_caixa(rs.getInt("mov_caixa"));
                m.setMov_usuario(rs.getInt("mov_usuario"));
                m.setData_mov(rs.getDate("data_mov"));
                m.setTipo(rs.getInt("tipo"));
                lista.add(m);
            }

        } catch (SQLException ex) {
        }

        return lista;
    }
    
     public Double ListarSaldoCaixa(int movcaixa) { //  Faz a soma do saldo referente ao caixa selecionado

         Double saldo = null;
        try {   
            String sql = "select sum(credito)+ sum(debito) from movimento where mov_caixa = ?";
            PreparedStatement stmt = con.prepareStatement(sql);
            stmt.setInt(1, movcaixa);
            ResultSet rs = stmt.executeQuery();
                       
            if (rs.next()){   
           saldo  = rs.getDouble(1);
            
            }
        } catch (SQLException ex) {
        }      
        return saldo;
    } 
     
//    public int UltimoCodMovimento() {
//
//        int cod = 0;
//        try {
//            String sql = "select max(cod_movimento) as codigo from movimento";
//            PreparedStatement ps = con.prepareStatement(sql);
//            ResultSet rs = ps.executeQuery();
//
//            while (rs.next()) {
//                cod = rs.getInt("codigo");
//            }
//        } catch (SQLException e) {
//            System.out.println(e.getMessage()+" Funcao MovimentoDao UltimoCodMovimento");
//        }
//        return cod;
//    }     
     
}
